#ifndef UI_WND_H
#define UI_WND_H

#include "log.h"
#include "my_console.h"

#include <stdint.h>
#include <stdbool.h>

typedef enum {
    WND_TYPE_BASE,
    WND_TYPE_LABEL,
    WND_TYPE_BUTTON
} EMWndType;

// 事件类型枚举
typedef enum {
    EVENT_CLICK,     // 点击事件
    EVENT_KEYPRESS,  // 按键事件
    EVENT_HOVER,
    E_MODAL_EVENT
    // ... 可扩展其他事件类型
} EventType;

typedef struct {
    int key;
    EventType type;
    STPoint point;
} STKeyEvent;

typedef struct STWnd STWnd;
typedef void (*WndCallback)(STWnd* wnd);
// 事件回调函数类型
typedef void (*EventCallback)(STWnd* sender, EventType event, void* userdata);

// 事件订阅节点（链表结构）
typedef struct EventSubscription {
    EventType event;             // 订阅的事件类型
    EventCallback callback;      // 回调函数
    void* userdata;              // 用户自定义数据
    struct EventSubscription* next; // 下一个订阅节点
} EventSubscription;

typedef enum {
    WND_OK,
    WND_ERR_NULL_PTR,
    WND_ERR_CYCLE,
    WND_ERR_ALREADY_CHILD,
    WND_ERR_NOT_FOUND
} WndResult;

#define WND_STATE_VISIBLE    0x0001,  // 窗口可见
#define WND_STATE_ENABLED    0x0002,  // 窗口可交互
#define WND_STATE_FOCUSED    0x0004,  // 窗口拥有焦点
#define WND_STATE_ACTIVE     0x0008,  // 窗口处于激活状态（如当前标签页）
#define WND_STATE_SELECTED   0x0010,  // 窗口被选中（如列表项）
#define WND_STATE_INVALID    0x0020,  // 数据非法（如输入错误）
#define WND_STATE_LOADING    0x0040,  // 数据加载中
#define WND_STATE_MODAL      0x0080,  // 模态窗口（阻塞其他操作）

typedef struct
{
    void (*OnInit)(STWnd *wnd);
    void (*OnDestroy)(STWnd *wnd);
    void (*OnAttach)(STWnd* wnd);   // 挂载到父节点时触发
    void (*OnDetach)(STWnd* wnd);   // 从父节点移除时触发
    void (*OnPaint)(STWnd *wnd);
    bool (*OnEvent)(STWnd *wnd, STKeyEvent ev);
} STWndVApi;

typedef struct
{
    void (*SetState)(STWnd* wnd, uint32_t flags);
    void (*ClearState)(STWnd* wnd, uint32_t flags);
    bool (*HasState)(STWnd* wnd, uint32_t flags);
    WndResult (*AddChild)(STWnd *parent, STWnd *child);
    WndResult (*FindById)(STWnd* root, uint32_t target_id, STWnd** result);
    void (*Traverse)(STWnd* root, WndCallback callback);
    void (*RemoveFromParent)(STWnd* child);
    STWnd* (*CreateWndEx)(size_t size, EMWndType type, const STWndVApi* vApi);

    void (*SubscribeEvent)(STWnd* wnd, EventType event, EventCallback callback, void* userdata);
    void (*UnsubscribeEvent)(STWnd* wnd, EventType event, EventCallback callback, void* userdata);
    void (*TriggerEvent)(STWnd* wnd, EventType event);

    void (*RenderTree)(STWnd* root);
    void (*DestroyTree)(STWnd* root);

    void (*DispatchEvent)(STKeyEvent ev); // 目标命中
} STWndApi;

extern const STWndApi g_wndApi;
extern uint32_t g_wnd_id_base;

#define MAX_Z_ORDER 10 // 假设最大层级为10
extern int current_max_z;
extern int current_z;
extern STWnd* g_roots[MAX_Z_ORDER];
typedef enum { SHAPE_RECT,
    SHAPE_CIRCLE } STShapeType;

struct STWnd
{
    uint32_t id;            // 自动生成的唯一ID
    uint32_t state;                // 状态标志位
    const STWndVApi *vApi;
    EMWndType type;
    STShapeType shapeType;
    STRect rect;

    STWnd *parent;
    STWnd *pre;
    STWnd *next;

    STWnd *firstChild;
    STWnd *lastChild;
    
    void (*OnStateChanged)(STWnd* wnd, uint32_t old_state); // 状态变化回调
    EventSubscription* eventSubscriptions; // 事件订阅链表头
};

STWnd *CreateWnd();
#endif
